package cn.xinfei.xdecision.common.dao.datax.datamanage.v2;

import cn.xinfei.xdecision.common.model.common.requestParam.UpdateFolderParam;
import cn.xinfei.xdecision.common.model.datax.datainterface.v2.VariableVO;
import cn.xinfei.xdecision.common.model.datax.datamanage.request.VariableBatchDeleteParam;
import cn.xinfei.xdecision.common.model.datax.datamanage.request.VariableDeleteParam;
import cn.xinfei.xdecision.common.model.datax.datamanage.request.VariableSaveAndUpdateParam;
import org.apache.ibatis.annotations.Param;

import cn.xinfei.xdecision.common.model.datax.datamanage.v2.Variable;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

import java.util.Collection;
import java.util.List;
import java.util.Map;

@Mapper
public interface VariableMapper extends BaseMapper<Variable> {

    Variable findByVarCode(@Param("varCode") String varCode);

    Variable findByVarCodeAndUserId(@Param("varCode") String varCode,@Param("userId") Long userId);

    List<Variable> findByVarCodes(@Param("varCodes") Collection<String> varCodes);

    List<Variable> findAllVars();

    List<Variable> findByVarCodesAndUserId(@Param("varCodes") Collection<String> varCodes,@Param("userId") Long userId);


    List<Long> findDistinctInterfaceIdsByVarCodes(@Param("varCodes") Collection<String> varCodes);

    Integer findExecutorVariableTypeByVarCode(@Param("varCode") String varCode);

    Variable findByVarCodeAndOrganId(@Param("varCode") String varCode, @Param("organId") Long organId);

    List<Variable> findByVarCodesAndOrganId(@Param("varCodes") Collection<String> varCodes, @Param("organId") Long organId);

    Variable findByVarName(@Param("varName") String varName);

    List<String> findScriptVarCodesByVarCodes(@Param("varCodes") Collection<String> varCodes);

    List<Variable> findAllVariables(Map<String, Object> paramMap);

    List<Variable> findAllNotDeriveVariables(Map<String, Object> paramMap);

    List<VariableVO> findCreditVarByVarCodes(@Param("varCodes") Collection<String> varCodes);

    List<VariableVO> findVarVosByVarCodes(@Param("varCodes") Collection<String> varCodes);



    List<Variable> searchAllVariable(Map<String, Object> paramMap);


    /**
     * findByVarType:(根据变量类型名找出该用户可用的变量列表). <br/>
     *
     * @param paramMap 参数集合
     * @return 字段列表
     */
    List<Variable> findByVarType(Map<String, Object> paramMap);

    /**
     * 查找接口变量
     */
    List<Variable> findInterfaceVars(Map<String, Object> paramMap);

    /**
     * 查找变量详情
     */
    List<Variable> findVarDetails(@Param("varCodes") Collection<String> varCodes,@Param("organId") Long organId);


    /**
     * checkVariable:(查找引用该变量的所有变量). <br/>
     *
     * @param paramMap 参数集合
     * @return 字段id逗号分隔字符串
     */
    String checkVariable(Map<String, Object> paramMap);


    /**
     * findVarByIdsForCheckVar:(找出一批变量id的变量列表（包含引擎引用的通用变量，engineId为空是不加engineId=null条件）). <br/>
     *
     * @param paramMap 参数集合
     * @return 字段列表
     */
    List<Variable> findVarByCodesForCheckVar(Map<String, Object> paramMap);


    /**
     * isExists:(根据变量英文或中文名查找变量是否存在). <br/>
     *
     * @param paramMap 参数集合
     * @return 存在的记录条数
     */
    int isExists(Map<String, Object> paramMap);



    /**
     * addVariable:(添加变量). <br/>
     *
     * @param variable 变量实体对象
     * @return 插入是否成功
     */
    int addVariable(VariableSaveAndUpdateParam variable);



    /**
     * batchAddVariable:(批量添加变量). <br/>
     *
     * @param varVoList 变量实体对象list集合
     * @return 变量类型列表
     */
    boolean batchAddVariable(List<Variable> varVoList);

    /**
     * findByVarName:(根据变量英文或中文名找出变量对象). <br/>
     *
     * @param paramMap 参数集合
     * @return 字段对象
     */
    Variable findByVarCodeOrVarName(Map<String, Object> paramMap);


    /**
     * getVariableList:(获取组织的所有变量). <br/>
     *
     * @param paramMap 参数集合
     * @return
     */
    List<Variable> getVariableList(Map<String, Object> paramMap);


    int updateVariableFolder(UpdateFolderParam param);

    /**
     * findByFieldCn:(根据变量中文名找出变量对象). <br/>
     *
     * @param paramMap 参数集合
     * @return 变量对象
     */
    Variable findByVariableName(Map<String, Object> paramMap);

    /**
     * findByVariableCode:(根据变量code查找变量对象). <br/>
     *
     * @param paramMap 参数集合
     * @return 变量对象
     */
    Variable findByVariableCode(Map<String, Object> paramMap);


    /**
     * updateVariable:(修改变量). <br/>
     *
     * @param variable 参数
     */

    int updateVariable(VariableSaveAndUpdateParam variable);


    /**
     * deleteVariable:(删除变量). <br/>
     *
     * @param variable 参数
     */

    void deleteVariable(VariableDeleteParam variable);


    /**
     * batchDeleteVariable:(批量删除变量). <br/>
     *
     * @param variable 参数
     */

    void batchDeleteVariable(VariableBatchDeleteParam variable);

    /**
     * findByUser:(找出该用户可用变量列表). <br/>
     *
     * @param paramMap 参数集合
     * @return 变量类型列表
     */
    List<Variable> findByUser(Map<String, Object> paramMap);


    void batchInsertOrUpdateVariables(@Param("variables") List<Variable> variables);


}
